package com.tinfeng.oop;

public class JavaPolym {
     // 多态
     //任何可以通过多个IS-A测试的 Java 对象都被视为多态的, 任何都可以通过IS-A ，因为都多态

    // 实现多态的条件
    // 1.满足继承关系   这个就是继承
    // 2.要有重写       重写也知道
    // 3.父类引用指向子类对象  重点是第三个
    /**
     * 在主方法中实例化对象的时候把dog、cat的对象转换为pet对象，就是父类引用指向子类对象，且这样叫做向上转型
     * public void main(String[] args) {
     *   	// 分别实例化三个对象，并且保持其类型为父类Pet
     *   	Pet pet = new Pet();
     *   	Pet dog = new Dog();
     *   	Pet cat = new Cat();
     *   	// 调用对象下方法
     *   	pet.eat();
     *   	dog.eat();
     *   	cat.eat();
     * }
     *
     */

    // 向上转型
    // 向上转型又称为自动转型、隐式转型。
    // 向上转型就是父类引用指向子类实例，也就是子类的对象可以赋值给父类对象
    // Pet dog = new Dog();

    // 这个是因为Dog类继承自Pet类，它拥有父类Pet的全部功能，所以如果Pet类型的变量指向了其子类Dog的实例，是不会出现问题的。
    // 向上转型实际上是把一个子类型安全地变成了更加抽象的父类型，由于所有类的根类都是Object，我们也把子类类型转换为Object类型
     // Cat cat = new cat();
     // object o = cat;

    // 向下转型
    /**子类引用指向父类实例
     * // 为Cat类增加run方法
     * class Cat extends Pet { // 继承父类
     *   	// 重写父类方法 eat
     *    	public void eat() {
     *       	System.out.println("猫猫吃猫粮");
     *     }
     *
     *   	public void run() {
     *       	System.out.println("猫猫跑步");
     *     }
     *
     *   	public static void main(String[] args) {
     *       	// 实例化子类
     *       	Pet cat = new Cat();
     *       	// 强制类型转换，只有转换为Cat对象后，才能调用其下面的run方法
     *       	Cat catObj = (Cat)cat;
     *       	catObj.run();
     *     }
     * }
     */

    // instanceof
    // instanceof运算符用来检查对象引用是否是类型的实例，或者这个类型的子类，并返回布尔值

    /**在向下转型之前，可以使用instanceof运算符判断，这样可以提高向下转型的安全性：
     * Pet pet = new Cat();
     * if (pet instanceof Cat) {
     * 		// 将父类转换为子类
     * 		Cat cat = (Cat) pet;
     * }
     */
}
